perm filename HEAP1D.SAI[YTD,BGB] blob sn#051805 filedate 1973-07-03 generic text, type T, neo UTF8
COMMENT ⊗   VALID 00003 PAGES 
RECORD PAGE   DESCRIPTION
 00001 00001
 00002 00002	SUBR HEAP1D (ITG ARRAY AA INTEGER N)
 00004 00003	α PHASE TWO, TAKE 'EM OFF THE TOP & PROMOTE SUBORDINATES
 00006 ENDMK
⊗;
SUBR HEAP1D (ITG ARRAY AA; INTEGER N);
S⊂ "HEAPSORT"
	LABEL A1,A2,A3,A4,A5,A6,A7,   A9,A10,A11,A12;
	LABEL L0,L1,L2,L3,L4,L5;
	LABEL WHILE,DONE;
	DEFINE I="1",J="2",K="3",X="4",A="0",AJ="5";
α ALITTLE ADDRESS MODIFICATION;
	MOVE	AA;SOS;	HRRM	A5;	HRRM	A6;
	HRRM	A1;	HRRM	A7;
	HRRM	A2;	HRRM	A9;	HRRM	A10;
	HRRM	A3;	HRRM	A12;
	HRRM	A4;
	HRRM	L2;	HRRM	DONE;	AOS;HRRM A11;
α PHASE ONE, PUT 'EM UNDER THE HEAP & BIGGIES TRICKLE UP;
α	FOR K←2 STEP 1 UNTIL N DO
α	BEGIN
α		I←K;
α		X←A[I];
α		WHILE I>1 ∧ X>A[J←I%2] DO
α		BEGIN A[I]←A[J]  I←J END;
α		A[I]←X;
α	END;
		MOVEI	K,2;
	L0:	CAMLE	K,N;
		JRST	L3;
		MOVE	I,K;
	A1:	MOVE	X,A(I);
	L1:	MOVE	J,I;
		LSH	J,-1;
		JUMPE	J,L2;
	A2:	CAMG	X,A(J);
		JRST	L2;
	A3:	MOVE	A(J);
	A4:	MOVEM	A(I);
		MOVE	I,J;
		JRST	L1;
	L2:	MOVEM	X,A(I);
		AOJA	K,L0;
	L3:
α PHASE TWO, TAKE 'EM OFF THE TOP & PROMOTE SUBORDINATES;
α	FOR K←N STEP -1 UNTIL 2 DO
α	BEGIN
α		X←A[K] A[K]←A[1] I←1;
α		WHILE (J←2*I)<K DO
α		BEGIN
α			IF (J+1)<K ∧ A[J+1]>A[J] THEN J←J+1;
α			IF X≥A[J] THEN DONE ELSE
α			BEGIN A[I]←A[J] I←J END;
α		END;
α		A[I]←X;
α	END;

		MOVE	K,N;
		SUB	'17,['3000003];
	L4:	CAIGE	K,2;
		JRST @3('17);
α X←A[K] A[K]←A[1] I←1;
	A5:	MOVE	X,A(K);
		MOVEI	I,1;
	A6:	MOVE	A(I);
	A7:	MOVEM	A(K);
α WHILE (J←2*I)<K DO;
		MOVE	J,I;
	WHILE:	LSH	J,1;
		CAML	J,K;
		JRST	DONE;
α IF (J+1)<K ∧ A[J+1]>A[J] THEN J←J+1;
	A9:	MOVE	AJ,A(J);
		CAIG	K,1(J);
		JRST	L5;
	A11:	CAML	AJ,A+1(J);
		JRST	L5;
		AOS	J;
	A10:	MOVE	AJ,A(J);
α IF X≥A[J] THEN DONE ELSE
α BEGIN A[I]←A[J] I←J END;
	L5:	CAML	X,AJ;
		JRST	DONE;
	A12:	MOVEM	AJ,A(I);
		MOVE	I,J;
		JRST	WHILE;
	DONE:	MOVEM	X,A(I);
		SOJA	K,L4;
END "HEAPSORT";
END	"HEAP1D";